package org.dromara.common.tenant.manager;

import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.redis.manager.PlusSpringCacheManager;
import org.dromara.common.tenant.helper.TenantHelper;
import org.springframework.cache.Cache;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：重写 cacheName 处理方法 支持多租户
 */
/**
 * TenantSpringCacheManager 类继承自 PlusSpringCacheManager，用于实现租户级别的缓存管理功能
 * 该类通过扩展父类的缓存管理能力，为不同的租户提供独立的缓存空间，从而达到租户间缓存隔离的目的
 */
public class TenantSpringCacheManager extends PlusSpringCacheManager {

    /**
     * 构造函数，用于创建 TenantSpringCacheManager 的实例
     * 该构造函数目前未实现具体的初始化逻辑，保留为空构造函数
     */
    public TenantSpringCacheManager() {
    }

    /**
     * 根据缓存名称获取缓存对象
     * 此方法支持全局缓存和租户级缓存的获取
     * 全局缓存是指以特定前缀开头的缓存，不受租户限制
     * 租户级缓存是指特定租户下的缓存，通过租户ID和缓存名称组合来区分
     *
     * @param name 缓存的名称，用于标识缓存
     * @return 返回对应的缓存对象，如果不存在，则返回null
     */
    @Override
    public Cache getCache(String name) {
        // 检查缓存名称是否包含全局缓存的标识
        if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
            // 如果是全局缓存，则直接调用父类方法返回缓存
            return super.getCache(name);
        }
        // 获取当前租户ID
        String tenantId = TenantHelper.getTenantId();
        // 检查缓存名称是否以当前租户ID开头
        if (StringUtils.startsWith(name, tenantId)) {
            // 如果存在则直接返回 如果缓存属于当前租户且已存在，则直接返回
            return super.getCache(name);
        }
        // 如果缓存不存在，尝试以"租户ID:缓存名称"的形式重新获取缓存
        return super.getCache(tenantId + ":" + name);
    }

}
